package cn.varton;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * 事件监听器
 */
public class EventListener {
    private Map<String,Event> eventMaps = new HashMap<>();
    /**
     * 添加加监听。相当于目标对象执行某操作时，绑定到观察者的某个要被触发的逻辑上
     * 如，鼠标被单击这个操作，绑定到鼠标观察者的onclick逻辑上
     */
    public void addListen(String operation){
        Event e = new Event();
        MouseObserver observer = new MouseObserver();
        e.setTarget(observer);
        try {
            e.setCallback(observer.getClass().getMethod("onClick",null));
        } catch (NoSuchMethodException e1) {
            e1.printStackTrace();
        }
        eventMaps.put(operation,e);
    }

    /**
     * 触发时，被执行的逻辑。即观察者类中定义的逻辑
     * 这里通过反射机制实现。需要拿到执行的方法/目标对象/方法参数
     */
    public void trigger(String operation){
        if (eventMaps.containsKey(operation)){
            Event e = eventMaps.get(operation);
            Object target = e.getTarget();
            Method m = e.getCallback();
            try {
                m.invoke(target,null);
            } catch (IllegalAccessException e1) {
                e1.printStackTrace();
            } catch (InvocationTargetException e1) {
                e1.printStackTrace();
            }
        }
    }
}
